#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <malloc.h>
#include <time.h>
#include <pthread.h>
#include <sys/types.h>
#include <dirent.h>
#include <gtk/gtk.h>
#include <ctype.h>

#define BUFFERSIZE 512
#define HOSTNAME "/proc/sys/kernel/hostname"   //主机名
#define OSTYPE "/proc/sys/kernel/ostype"       //系统类型
#define VERSION "/proc/sys/kernel/version"     //内核版本
#define OSRELEASE "/proc/sys/kernel/osrelease" //内核编译时间
#define CPUVERSION "/proc/cpuinfo"             //CPU信息
#define UPTIME "/proc/uptime"                  //系统运行时间信息
#define STAT "/proc/stat"                      //CPU运行信息
#define MEMINFO "/proc/meminfo"                //内存信息
#define EVENT_METHOD(i, x) GTK_WIDGET_GET_CLASS(i)->x

struct process_data
{
    char name[BUFFERSIZE];
    int pid;
    int row;
    // bool n_flag, flag;
    bool p_flag;
} proc_data; //结束进程的信息
struct _run_data
{
    char name[BUFFERSIZE];
    int pid;
    bool n_flag;
} run_data; //要启动进程的信息
struct co   //cpu和内存使用的y坐标
{
    int cy[121], my[121], sy[121];
    int i;
} y_co;
GtkWidget *window;         //主窗口
GtkWidget *run_time_label; //系统到目前为止持续运行的时间
GtkWidget *time_label, *cpu_label, *mem_label;
GtkWidget *label1, *label2, *label3, *label4, *label5, *label6; //进程界面标签
// GtkWidget *clist;                                               //进程信息列表
int a = 0, s = 0, r = 0, idle = 0, z = 0, t = 0;      //各种进程个数
static GtkWidget *cpu_draw, *mem_draw;                //cpu和内存绘图窗口
static GdkPixmap *cpu_map = NULL, *mem_map = NULL;    //cpu和内存绘图区的pixmap
GdkColor color1, color2, color3, color4, color5;      //绘图使用的颜色
GdkGC *gc_front1, *gc_front2, *gc_front3, *gc_front4; //gc前景色
gint timeout_tag[5];                                  //超时函数句柄

void init_color_front();                      //初始化color和gc_front;
void get_start_time(long r_time, char *temp); //获取系统启动时间
void get_cpu_rate(char *temp_buf);            //获取cpu使用率
void get_mem_rate(char *temp_buf);            //获取mem使用率
gint shutdown_now();                          //关机
gint refrush_run_time();                      //更新系统持续运行时间

void get_process_info(gpointer clist);                     //获取全部进程的信息
void set_pid_name_flag(GtkWidget *combo, gpointer data);   //下拉框回调函数，设置从输入框接收的文本类型
void changed_callback(GtkWidget *entry, gpointer button);  //结束进程输入框输入变动回调函数
void changed_callback1(GtkWidget *entry, gpointer button); //启动进程输入框输入变动回调函数
//select_row的回调信号
// void select_row_callback(GtkWidget *clist1, gint row, gint column, GdkEventButton *event, gpointer data);
gint kill_process(GtkWidget *button, gpointer clist); //点击按钮杀死进程响应函数
gint run_process(gpointer button);                    //点击按钮启动新进程响应函数

gint refrush_process(gpointer clist); //定时更新进程界面
void refrush_process_num();           //更新进程数目统计

bool draw_init();                                                      //画图窗口初始化
gint expose_event(GtkWidget *drawingarea, GdkEventExpose *event);      //暴露事件回调函数
gint expose_event1(GtkWidget *drawingarea, GdkEventExpose *event);     //暴露事件回调函数--CPU图例
gint expose_event2(GtkWidget *drawingarea, GdkEventExpose *event);     //暴露事件回调函数--内存图例
gint expose_event3(GtkWidget *drawingarea, GdkEventExpose *event);     //暴露事件回调函数--swap图例
int configure_event(GtkWidget *drawingarea, GdkEventConfigure *event); //响应cofigure事件
gint refrush_draw_cpu_mem_activity();                                  //更新cpu和内存活动图